package wangwang;

import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import tms.SvmResult;

/**
 *@author 张知临 zhzhl202@163.com
 *@version 创建时间:2011-11-28下午03:22:49
 *类说明:
 *旺旺聊天内容的封装：
 *几个重要问题：
 *1、从聊天内容中提取出各种特征。
 *2、SVM模型预测需要的是已经分好词的内容或者是提取出各个词的List，因此这里需要加入segedChatContent或者是List<String>
 *3、需要把内容和各种特征链接起来一起放入SVM模型中预测。因此可以提供分词符号，然后用分词符号把内容和特征链接起来。或者把特征放入到List<String>中。
 */
public class WangIM {
	
	private String from;//发送方
	private String to;//接收方
	private String chatContent;//聊天内容
	private SvmResult svmResult;//SVM模型预测的结果
	private String link;//聊天中连接特征:淘宝链接（have_taobao_link）、外部联系（have_outside_link）或者是不含链接（no_link_msg）
	private String qq;//qq特征:没有QQ：noQQQQQQQ，包含QQ：QQQQQQQ
	private String auctionOwner; //商品拥有者：
	private String auctionAttr;//商品属性
	private Date sendDate;//消息发送日期

	public WangIM(String from,String to,String chatContent,Date sendDate){
		this.from = from;
		this.to = to;
		this.chatContent = chatContent;
		this.sendDate = sendDate;
		this.init();
	}
	
	public void init(){
		//从聊天内容中提取出QQ特征
		this.qq_flag();
		//从聊天内容中提取出链接属性
		this.link_flag();
		//从聊天内容中提取出商品拥有者及商品属性
		this.auction_detail();
	}
	
	

	/**
	 * 给link赋值：判断文本是否含有淘宝链接（have_taobao_link）、外部联系（have_outside_link）或者是不含链接（no_link_msg）
	 */
	public  void link_flag(){
		link = "no_link_msg";
		if(chatContent == null || chatContent.equals(""))
			return;
		if(chatContent.indexOf("taobao.com")>=0 || chatContent.indexOf("tmall.com")>=0)
			link = "have_taobao_link";
		else {
			if(is_link_in(chatContent))
				link = "have_outside_link";
			else link = "no_link_msg";
		}
	}
	
	/**
	 * 判断文本是否含有链接的辅助函数
	 */
	public  boolean is_link_in(String sseg){
		if(sseg == null || sseg.equals(""))
			return false;
		
		String delim = "\\w{1,20}\\.\\w{1,20}\\.\\w{1,20}";
		String[] list = sseg.split(delim);
		if(list.length>=2)
			return true;
		else
			return false;
	}
	
	
	/**
	 * 从聊天内容中提取出QQ特征.判断文本是否含有QQ信息（含有的话则为qq_flag = "QQQQQQQ";不含有的话则为：link_flag = "no_link_msg";）
	 */
	public  void qq_flag(){
		qq = "noQQQQQQQ";	
		if(is_qq_in(chatContent))
			qq = "QQQQQQQ";
	}
	//判断文本中是否含有QQ信息的辅助函数
	public  boolean is_qq_in(String sseg){
		if(sseg == null || sseg.equals(""))
			return false;
		
		String [] tmp = sseg.split("(电话|手机|支付宝账号|订单号)");
		if(tmp.length>=2)
			return false;
		
		Pattern pattern_11 = Pattern.compile(".*1[0-9]{10}.{0,15}(联系).*");
		Pattern pattern_12 = Pattern.compile(".*(联系).{0,15}1[0-9]{10}.*");
		Pattern pattern_13 = Pattern.compile(".*(q|Q|扣|球).*");
				
		
		String[] seg_list = sseg.split("(加我|加|联系|联系我).{0,4}[q|Q|扣|球]");//新增间隔距离，从{0,1}到{0,4}
		if(seg_list.length>=2)
			return true;
			
		
		Pattern pattern_1 = Pattern.compile(".*[1-9][0-9]{7,11}.{0,15}(联系|加|q|Q|求|球|扣|号|会员|群).*");
		Pattern pattern_2 = Pattern.compile(".*(联系|加|q|Q|求|球|扣|号|会员|群).{0,15}[1-9][0-9]{7,11}.*");
		Pattern pattern_3 = Pattern.compile(".*[①②③④⑤⑥⑦⑧⑨]{2,}.{0,15}(联系|加|q|Q|求|球|扣|号|会员|群).*");
		Pattern pattern_4 = Pattern.compile(".*(联系|加|q|Q|求|球|扣|号|会员|群).{0,15}[①②③④⑤⑥⑦⑧⑨]{2,}.*");
		
		
		String delim = "\\w+\\.\\w+\\.\\w+[\\w\\?=%--&/\\.\\\\]*" + "|" + "\\w+[\\w\\?=%--&/]{20,}" + "|" + "0\\d{10,}" + "|" + "\\d{13,}";
		//"\\w+[\\w\\?=]{20,}";
		String[] list = sseg.split(delim);
		int len = list.length;
		for(int i=0;i<len;i++)
		{
			
			if(list[i]==null || list[i].equals(""))
				continue;
			System.out.println(i+":"+list[i]);
			
			if((pattern_11.matcher(list[i]).matches() || pattern_12.matcher(list[i]).matches()) && !pattern_13.matcher(list[i]).matches())
				return false;
			
			Matcher matcher;
			matcher = pattern_1.matcher(list[i]);
			if(matcher.matches())
				return true;
			matcher = pattern_2.matcher(list[i]);
			if(matcher.matches())
				return true;
			matcher = pattern_3.matcher(list[i]);
			if(matcher.matches())
				return true;
			matcher = pattern_4.matcher(list[i]);
			if(matcher.matches())
				return true;
		}
		
		return false;
	}

	//判断
	/**
	 * 抽取聊天文本中的商品链接ID
	 */
	public  String auction_id_extract(String sseg){
		String tmp_num = "000123456789";
		String delim = "http://item.taobao.com/item.htm\\?id=" + "|" + "http://item.tmall.com/item.htm\\?id=" + "|" + "http://spu.tmall.com/spu_detail.htm\\?mallstitemid=" + "|" + "http://item.taobao.com/auction/item_detail.jhtml\\?item_num_id=" + "|" + "http://item.taobao.com/meal_detail.htm\\?meal_id=" + "|" + "http://item.taobao.com/auction/item_detail.htm\\?item_num_id=";
		

		if(sseg == null || sseg.equals(""))
				return tmp_num;
		String[] k = sseg.split(delim);
		if(k.length < 2 || (k[1]==null || k[1].equals("")))
				return tmp_num;

		if(k[1].length()>=10 && k[1].length()<=11 && isNumeric(k[1]))
		{
				tmp_num = k[1];
				return tmp_num;
		}
				
		if(k[1].length()<11)
					return tmp_num;
		if(k[1].length()>=12)
		{
			if(isNumeric(k[1].substring(0,11)))
			{
				tmp_num = k[1].substring(0,11);
				return tmp_num;
			}
			if(isNumeric(k[1].substring(0,10)))
			{
				tmp_num = k[1].substring(0,10);
				return tmp_num;
			}
		}
				
		if(k[1].length() == 11)
		{
			if(isNumeric(k[1].substring(0,10)))
			{
				tmp_num = k[1].substring(0,10);
				return tmp_num;
			}
		}	
		
		return tmp_num;
	}

	//给auctionOwner、auctionAttr赋值：判断文本的商品归属（属于发送方、接收方还是谁都不属于）、商品是否是虚拟商品
	/**
	 * 
	 */
	public  void auction_detail()
	{
		String owner_flag;//商品的归属
		String virtual_flg;//商品是否是虚拟商品
		
		String auction_id = auction_id_extract(chatContent);
		
		if(auction_id.equals("000123456789"))
		{
			auctionOwner = "no_auction_exist";
			auctionAttr = "no_auction_here";
		}
		else
		{
			//伪代码
			将该商品id到商品表中查询，如果改商品为虚拟商品，则：
			auctionAttr = "virtual_auction_id";
			否者：auctionAttr = "material_auction_id";
			
			将该商品id到商品表中查询，取得该商品的所有者，如果该商品的所有者是发送方或者接收方，则：
			auctionOwner = "somebody_owner";
			否者：auctionOwner = "nobody_owner";
		}
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
		
	}

